package abstract1;

public abstract class Shape {
    public abstract String toString();//强行声明为抽象方法，toString方法是OBject类里面定义的方法，所以继承于他

    /**
     * 方法draw是用来绘制图形的抽象方法
     * 在类Shape派生类中实现该方法的主体
     */
    public abstract void draw();

    /**
     * 方法print是用于显示图形信息，并绘制图形
     * 1.显示方法toString返回的字符串,并换行
     * 2.调用方法draw来绘制图形
     */

    public void print(){
        System.out.println(toString());
        draw();
        System.out.println();
    }
}


abstract class AbstLine extends Shape{
    /**
     * 表示直线长度的int型字段
     */

    private int length;

    /**
     * 创建直线的构造函数
     * 接收长度参数，
     * @param length 创建直线长度
     */
    AbstLine(int length){
        setLength(length);//构造函数里写set方法
    }

    /**
     * 获取直线的长度
     * @return
     */
    public int getLength(){
        return length;
    }

    /**
     * 设置直线长度
     * @param length
     */
    public void setLength(int length)
    {
        this.length=length;
    }
    public String toString(){
        return "AbsLine(length:"+length+")";
    }

}


/**
 * 是表示点的类
 * 该类派生自图形的抽象类Shape
 * 无字段
 */

class Point extends Shape{

    Point(){}
    public String toString(){
        return "point";
    }
    public void draw(){
        System.out.println('+');
    }
}










class VertLine extends AbstLine{

    VertLine(int length){
        super(length);
    }
    public void draw(){
        for (int i = 0; i <getLength();i++) {
            System.out.println("|");
        }

    }

    @Override
    public String toString() {
        return "VertLine(length:"+getLength()+")";
    }
}


